package com.gzc.just.play.last.war.common.share.data;

import com.gzc.just.play.last.war.common.share.cache.UnifiedCacheService;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;

/**
 * 统一Repository工厂接口
 * 用于创建支持不同数据库的Repository实例
 */
public interface RepositoryFactory {
    
    /**
     * 创建Repository实例
     */
    <T, ID extends Serializable> JpaRepository<T, ID> createRepository(Class<T> entityClass);
    
    /**
     * 创建带缓存的Repository实例
     */
    <T, ID extends Serializable> CachedRepository<T, ID> createCachedRepository(Class<T> entityClass);
    
    /**
     * 获取数据访问服务
     */
    DataAccessService getDataAccessService();
    
    /**
     * 获取缓存服务
     */
    UnifiedCacheService getCacheService();
    
    /**
     * 支持缓存的Repository接口
     */
    @NoRepositoryBean
    interface CachedRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
        
        /**
         * 根据ID查找实体（带缓存）
         */
        T findByIdCached(ID id);
        
        /**
         * 查询所有实体（带缓存）
         */
        java.util.List<T> findAllCached();
        
        /**
         * 根据ID列表查询实体（带缓存）
         */
        java.util.List<T> findAllByIdCached(java.lang.Iterable<ID> ids);
        
        /**
         * 保存并更新缓存
         */
        <S extends T> S saveAndCache(S entity);
        
        /**
         * 批量保存并更新缓存
         */
        <S extends T> java.util.List<S> saveAllAndCache(java.lang.Iterable<S> entities);
        
        /**
         * 删除并清除缓存
         */
        void deleteByIdAndEvictCache(ID id);
        
        /**
         * 删除实体并清除缓存
         */
        void deleteAndEvictCache(T entity);
        
        /**
         * 批量删除并清除缓存
         */
        void deleteAllAndEvictCache(java.lang.Iterable<? extends T> entities);
        
        /**
         * 删除所有并清除缓存
         */
        void deleteAllAndEvictCache();
        
        /**
         * 清除实体缓存
         */
        void evictCache(ID id);
        
        /**
         * 清除所有实体缓存
         */
        void evictAllCache();
    }
}